package god;

import god.model.SungJuk2VO;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;

public class J19ArrayList {

	public static void main(String[] args) {
		
		// ArrayList
		// 실무에서 빈번하게 사용되는 컬렉션 객체 중 하나
		// 배열과 달리 가변 데이터 크기를 가짐
		// 중복값을 저장할 수 있고, 입력되는 값들은 순서를 가짐
		
		// 문자열 을 입력 받는 ArrayList woman 을 선언 및 생성
		ArrayList<String> woman = new ArrayList<>();					// 단일값
		ArrayList<SungJuk2VO> sj = new ArrayList<>();				// 객체값 (훨신 많이 사용.)
		
		// 추가하기 add() - Service 클래스의 new 역할을 하면 됨
		woman.add("수진");
		woman.add("지은");
		woman.add("주은");
		
		sj.add(new SungJuk2VO("수진",98,94,97));
		sj.add(new SungJuk2VO("지은",99,98,97));
		sj.add(new SungJuk2VO("주은",88,84,92));
		
		// 하나씩 조회 get(위치 또는 순서) - Service 클래스의 read 역할
		System.out.println(woman.get(0));
		System.out.println(woman.get(1));
		System.out.println(woman.get(2));
		
		System.out.println(sj.get(0));											// SungJuk2VO 에서 toString에서 값들을 리턴해 주기 때문에 출력이 됨
		System.out.println(sj.get(1));											// toString이 없으면 주소값이 출력됨
		System.out.println(sj.get(2));											
		
		System.out.println(sj.get(0).getName());							// System.out.println(sj.get(0).getName());	을 출력하면 0번째 데이터의 name만 받아서 출력한다.
		System.out.println(sj.get(1).getName());							// toString이 없어도 출력이 됨
		System.out.println(sj.get(2).getName());
		
		// 몽땅 출력 (for-each문 사용) - Service 클래스의 read 역할
		// ArrayList<a> b = new ArrayList<>();
		// for (a 변수명 : b) {}
		// for ( 요소유형 요소명 : ArrayList 객체명)
		for(String str : woman) {													// woman 컬렉션 안에서 String 형태의 str 이름으로 뽑아냄
			System.out.println(str);
		}
		
		for(SungJuk2VO s : sj) {
			System.out.println(s);
		}
		
		// 수정 하기 set(위치, 값) - Service 클래스의 modify 역할
		// 단일 타입
		System.out.println(woman.get(1));
		woman.set(1, "아이유");
		System.out.println(woman.get(1));
		
		// 객체 타입
		SungJuk2VO newOne = new SungJuk2VO("지현", 94, 91, 87);	// 수정할 데이터의 객체를 먼저 만들고 set으로 넣어줌
		System.out.println(sj.get(2));														// new로 생성 후 넣어주는게 번거롭기 때문에 sql문을 사용
		sj.set(2, newOne);
		System.out.println(sj.get(2));
		
		// 삭제 하기 remove(위치) - Service 클래스의 remove 역할
		woman.remove(1);
		sj.remove(2);
		
		for(String str : woman) {
			System.out.println(str);
		}
		
		for(SungJuk2VO s : sj) {
			System.out.println(s);
		}
		
		// contains - 존재 여부 확인 / indexOf - 찾기
		String key = "지은";
		if (woman.contains(key)) {																// boolean 타입.
			System.out.println("데이터가 존재합니다.");
			System.out.println("위치는 " + woman.indexOf(key));				// 몇번째에 데이터가 있는지
		} else {
			System.out.println("데이터가 없습니다.");
		}
		
		for(SungJuk2VO s : sj) {
			if(s.getName().contains(key)) {											// 객체는 주소값이 출력되기 때문에 그 주소에서 name을 받아서 비교를 해야함
				System.out.println("찾았어요!");									// get(1) 의 이름을 받아서 key와 비교를 함
				System.out.println("위치는 " + sj.indexOf(s));	
			} else {																					// 전체 조회 s의 이름들과 계속 비교를 해서 찾으면 출력
				System.out.println("못찾았어요!");								// sql문으로 간단하게 할 수 있음
			}
		}
		// 정렬 sort
		Collections.sort(woman);
		
		for(String str : woman) {
			System.out.println(str);
		}
		
		// 객체를 대상으로 정렬하려면
		// Comparator 인터페이스를 구현하고 Collections.sort(대상, 정렬기준);
		// 으로 호출해서 사용해야 함
		Collections.sort(sj, new NameSort());
		for(SungJuk2VO s : sj) {
			System.out.println(sj);
		}

		// 모두 삭제 clear
		woman.clear();
		sj.clear();
		
		for(String str : woman) {
			System.out.println(str);
		}
		
		for(SungJuk2VO s : sj) {
			System.out.println(s);
		}
	}

}

class NameSort implements Comparator<SungJuk2VO> {

	@Override
	public int compare(SungJuk2VO sj1, SungJuk2VO sj2) {					// sj1의 값과 sj2의 값을 비교한 후 어떻게 하라는 코드를 입력해줘야함
		return sj1.getName().compareTo(sj2.getName());							// sj1과 sj2를 비교하면 정순, sj2와 sj1을 비교하면 역순
	}
	
}
